@@ -76,17 +76,19 @@ class ScenarioImport |
||
76 | 76 |
agent.schedule = agent_diff.schedule.updated if agent_diff.schedule.present? |
77 | 77 |
agent.keep_events_for = agent_diff.keep_events_for.updated if agent_diff.keep_events_for.present? |
78 | 78 |
agent.propagate_immediately = agent_diff.propagate_immediately.updated if agent_diff.propagate_immediately.present? # == "true" |
79 |
+ agent.service_id = agent_diff.service_id.updated if agent_diff.service_id.present? |
|
79 | 80 |
unless agent.save |
80 | 81 |
success = false |
81 | 82 |
errors.add(:base, "Errors when saving '#{agent_diff.name.incoming}': #{agent.errors.full_messages.to_sentence}") |
82 | 83 |
end |
83 | 84 |
agent |
84 | 85 |
end |
85 |
- |
|
86 |
- links.each do |link| |
|
87 |
- receiver = created_agents[link['receiver']] |
|
88 |
- source = created_agents[link['source']] |
|
89 |
- receiver.sources << source unless receiver.sources.include?(source) |
|
86 |
+ if success |
|
87 |
+ links.each do |link| |
|
88 |
+ receiver = created_agents[link['receiver']] |
|
89 |
+ source = created_agents[link['source']] |
|
90 |
+ receiver.sources << source unless receiver.sources.include?(source) |
|
91 |
+ end |
|
90 | 92 |
end |
91 | 93 |
end |
92 | 94 |
|
@@ -149,6 +151,9 @@ class ScenarioImport |
||
149 | 151 |
errors.add(:base, "Your updated options for '#{agent_data['name']}' were unparsable.") |
150 | 152 |
end |
151 | 153 |
end |
154 |
+ if agent_diff.requires_service? && merges.present? && merges[index.to_s].present? && merges[index.to_s]['service_id'].present? |
|
155 |
+ agent_diff.service_id = AgentDiff::FieldDiff.new(merges[index.to_s]['service_id'].to_i) |
|
156 |
+ end |
|
152 | 157 |
agent_diff |
153 | 158 |
end |
154 | 159 |
end |
@@ -192,6 +197,10 @@ class ScenarioImport |
||
192 | 197 |
@requires_merge |
193 | 198 |
end |
194 | 199 |
|
200 |
+ def requires_service? |
|
201 |
+ !!agent_instance.try(:oauthable?) |
|
202 |
+ end |
|
203 |
+ |
|
195 | 204 |
def store!(agent_data) |
196 | 205 |
self.type = FieldDiff.new(agent_data["type"].split("::").pop) |
197 | 206 |
self.options = FieldDiff.new(agent_data['options'] || {}) |
@@ -252,5 +261,9 @@ class ScenarioImport |
||
252 | 261 |
key.gsub(/[^a-zA-Z0-9_-]/, '') |
253 | 262 |
end |
254 | 263 |
end |
264 |
+ |
|
265 |
+ def agent_instance |
|
266 |
+ "Agents::#{self.type.updated}".constantize.new |
|
267 |
+ end |
|
255 | 268 |
end |
256 | 269 |
end |
@@ -120,6 +120,16 @@ |
||
120 | 120 |
</div> |
121 | 121 |
<% end %> |
122 | 122 |
</div> |
123 |
+ <% if agent_diff.requires_service? %> |
|
124 |
+ <div class='row'> |
|
125 |
+ <div class='col-md-4'> |
|
126 |
+ <div class="form-group type-select"> |
|
127 |
+ <%= label_tag "scenario_import[merges][#{index}][service_id]", 'Service' %> |
|
128 |
+ <%= select_tag "scenario_import[merges][#{index}][service_id]", options_for_select(agent_diff.agent_instance.valid_services(current_user).collect { |s| ["(#{s.provider}) #{s.name}", s.id]}, agent_diff.service_id.try(:current)), class: 'form-control' %> |
|
129 |
+ </div> |
|
130 |
+ </div> |
|
131 |
+ </div> |
|
132 |
+ <% end %> |
|
123 | 133 |
</div> |
124 | 134 |
<% end %> |
125 | 135 |
</div> |
@@ -11,7 +11,7 @@ |
||
11 | 11 |
# |
12 | 12 |
# It's strongly recommended that you check this file into your version control system. |
13 | 13 |
|
14 |
-ActiveRecord::Schema.define(version: 20140605032822) do |
|
14 |
+ActiveRecord::Schema.define(version: 20140723110551) do |
|
15 | 15 |
|
16 | 16 |
# These are extensions that must be enabled in order to support this database |
17 | 17 |
enable_extension "plpgsql" |
@@ -45,6 +45,18 @@ describe ScenarioImport do |
||
45 | 45 |
:options => trigger_agent_options |
46 | 46 |
} |
47 | 47 |
end |
48 |
+ let(:valid_parsed_basecamp_agent_data) do |
|
49 |
+ { |
|
50 |
+ :type => "Agents::BasecampAgent", |
|
51 |
+ :name => "Basecamp test", |
|
52 |
+ :schedule => "every_2m", |
|
53 |
+ :keep_events_for => 0, |
|
54 |
+ :propagate_immediately => true, |
|
55 |
+ :disabled => false, |
|
56 |
+ :guid => "a-basecamp-agent", |
|
57 |
+ :options => {project_id: 12345} |
|
58 |
+ } |
|
59 |
+ end |
|
48 | 60 |
let(:valid_parsed_data) do |
49 | 61 |
{ |
50 | 62 |
:name => name, |
@@ -407,5 +419,48 @@ describe ScenarioImport do |
||
407 | 419 |
end |
408 | 420 |
end |
409 | 421 |
end |
422 |
+ |
|
423 |
+ context "agents which require a service" do |
|
424 |
+ let(:valid_parsed_services) do |
|
425 |
+ data = valid_parsed_data |
|
426 |
+ data[:agents] = [valid_parsed_basecamp_agent_data, |
|
427 |
+ valid_parsed_trigger_agent_data] |
|
428 |
+ data |
|
429 |
+ end |
|
430 |
+ |
|
431 |
+ let(:valid_parsed_services_data) { valid_parsed_services.to_json } |
|
432 |
+ |
|
433 |
+ let(:services_scenario_import) { |
|
434 |
+ _import = ScenarioImport.new(:data => valid_parsed_services_data) |
|
435 |
+ _import.set_user users(:bob) |
|
436 |
+ _import |
|
437 |
+ } |
|
438 |
+ |
|
439 |
+ describe "#generate_diff" do |
|
440 |
+ it "should check if the agent requires a service" do |
|
441 |
+ agent_diffs = services_scenario_import.agent_diffs |
|
442 |
+ basecamp_agent_diff = agent_diffs[0] |
|
443 |
+ basecamp_agent_diff.requires_service?.should == true |
|
444 |
+ end |
|
445 |
+ |
|
446 |
+ it "should add an error when no service is selected" do |
|
447 |
+ services_scenario_import.import.should == false |
|
448 |
+ services_scenario_import.errors[:base].length.should == 1 |
|
449 |
+ end |
|
450 |
+ end |
|
451 |
+ |
|
452 |
+ describe "#import" do |
|
453 |
+ it "should import" do |
|
454 |
+ services_scenario_import.merges = { |
|
455 |
+ "0" => { |
|
456 |
+ "service_id" => "0", |
|
457 |
+ } |
|
458 |
+ } |
|
459 |
+ lambda { |
|
460 |
+ services_scenario_import.import.should == true |
|
461 |
+ }.should change { users(:bob).agents.count }.by(2) |
|
462 |
+ end |
|
463 |
+ end |
|
464 |
+ end |
|
410 | 465 |
end |
411 | 466 |
end |